<?php
namespace app\controller;

// 引用基础控制器
use app\BaseController;
// 引用view的视图
use think\facade\View;
// auth中间件
use app\middleware\Auth;
use app\model\Contact;
use app\model\Type;
// 引用验证码
use think\captcha\facade\Captcha;
// 引用验证器
use think\facade\Validate;

// 引用用户模型
use app\model\User;

class Index extends BaseController
{
    // 控制器中间件
    protected $middleware = [
        // 设置方法不走中间件
        Auth::class => ['except' => ['login','register','verify']]
    ];

    // 初始化
    protected function initialize()
    {
        // 手动继承父级的初始化函数
        parent::initialize();

        // 引用用户模型
        $this->UserModel = new User();

        // 引用分类模型
        $this->TypeModel = new Type();

        $this->ContactModel = new Contact();
    }

    // 首页
    public function index()
    {
        // 接收分类id
        $typeid = $this->request->param('typeid',0);

        // 接收搜索值
        $keyword = $this->request->param('keyword','');

        // 查询分类数据
        $TypeList = $this->TypeModel->order('id','desc')->select();

        // 条件数组
        $where = [
            'userid' => request()->LoginUser['id']
        ];

        if(!empty($typeid))
        {
            $where['typeid'] = $typeid;
        }

        if(!empty($keyword))
        {
            $where['nickname'] = $keyword;
        }

        $ContactList = $this->ContactModel->where($where)->order('id','desc')->select();

        return View::fetch('',[
            'TypeList' => $TypeList,
            'typeid' => $typeid,
            'ContactList' => $ContactList,
            'keyword' => $keyword
        ]);
    }

    // 登录
    public function login()
    {

        // 获取cookie
        $LoginUser = Cookie('LoginUser');

        // json字符串转成数组
        $LoginUser = json_decode($LoginUser,true);

        // 判断cookie是否为空
        if(!empty($LoginUser))
        {
            $userid = !empty($LoginUser['id']) ? $LoginUser['id'] : 0;

            $User = $this->UserModel->find($userid);

            if(!$User)
            {
                // cookie属于伪造的
                cookie('LoginUser', null);
                $this->error('非法登录', url('index/login'));
                halt();
            }

            $this->success('你已经登录，无需重复登录', url('index/index'));
            halt();
        }

        if($this->request->isPost())
        {
            // 接收从表单过来的邮箱
            $email = $this->request->param('email','');
            
            // 接收从表单过来的密码
            $passowrd = $this->request->param('password','');

            // 接收从表单过来的验证码
            $captcha = $this->request->param('captcha','');

            // 判断验证码是否正确
            if(!captcha_check($captcha))
            {
                $this->error('验证码错误，重新请输入');
                halt();
            }

            // 判断邮箱是否存在
            if(!$email)
            {
                $this->error('邮箱不能为空');
                halt();
            }

            // 判断密码是否存在
            if(!$passowrd)
            {
                $this->error('密码不能为空');
                halt();
            }

            // 查询该邮箱是否存在
            $User = $this->UserModel->where(['email' => $email])->find();

            if(!$User)
            {
                $this->error('用户不存在',url('index/register'));
                halt();
            }

            // 接收的密码跟查询出来的密码盐加密
            $passowrd = md5($passowrd . $User['salt']);

            // 判断是否不相等
            if($passowrd != $User['password'])
            {
                $this->error('密码错误');
                halt();
            }

            // 封装cookie数据
            $data = [
                'id' => $User['id'],
                'nickname' => $User['nickname'],
                'email' => $User['email'],
                'avatar' => $User['avatar'],
                'sex' => $User['sex'],
                'phone' => $User['phone']
            ];

            // 数组转json字符串
            $data = json_encode($data);

            // 设置session
            cookie('LoginUser',$data);

            // 登录成功后跳转
            $this->success('登录成功',url('index/index'));
            halt();

        }

        // 该方法不启用模板布局
        View::config(['layout_on' => false,]);

        // 输出视图
        return View::fetch();
    }

    // 注册
    public function register()
    {
        // 获取cookie
        $LoginUser = cookie('LoginUser');

        $LoginUser = json_decode($LoginUser,true);

        // 判断cookie是否为空
        if(!empty($LoginUser))
        {
            $userid = !empty($LoginUser['id']) ? $LoginUser['id'] : 0;

            $User = $this->UserModel->find($userid);

            if(!$User)
            {
                // cookie属于伪造的
                cookie('LoginUser', null);
                $this->error('非法登录', url('index/login'));
                halt();
            }

            $this->success('你已经注册，无需重复注册', url('index/index'));
            halt();
        }

        // 是否有POST请求
        if($this->request->isPost())
        {
            // 接收从表单过来的邮箱
            $email = $this->request->param('email','');
            
            // 接收从表单过来的密码
            $passowrd = $this->request->param('password','');

            // 接收从表单过来的验证码
            $captcha = $this->request->param('captcha','');

            // 判断验证码是否正确
            if(!captcha_check($captcha))
            {
                $this->error('验证码错误，重新请输入');
                halt();
            }

            // 判断邮箱是否存在
            if(!$email)
            {
                $this->error('邮箱不能为空');
                halt();
            }

            // 判断密码是否存在
            if(!$passowrd)
            {
                $this->error('密码不能为空');
                halt();
            }

            // 生成密码盐
            $salt = build_ranstr();

            // 加密
            $passowrd = md5($passowrd . $salt);

            // 封装要插入的数据
            $data = [
                'email' => $email,
                'password' => $passowrd,
                'salt' => $salt
            ];

            // 引用验证规则
            $validate = Validate::rule('app\validate\User.register');

            // 验证
            if(!$validate->check($data))
            {
                $this->error($validate->getError());
                halt();
            }

            // 插入数据库
            $result = $this->UserModel->save($data);

            // 插入是否成功
            if($result === FALSE)
            {
                $this->error('注册失败');
                halt();
            }else{
                $this->success('注册成功',url('index/login'));
                halt();
            }
        }

        // 该方法不启用模板布局
        View::config(['layout_on' => false]);

        // 输出视图
        return View::fetch();
    }

    // 退出
    public function logout()
    {
        if($this->request->isPost())
        {
            cookie('LoginUser',null);
            $this->success('退出成功');
            halt();
        }
    }

    // 验证码
    public function verify()
    {
        // 调用verify配置并且创建验证码
        return Captcha::create('verify');
    }
}
